문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 디자인 패턴 (문단 편집) === 싱글톤(Singleton) === {{{#!syntax java class Singleton { static final Singleton instance = new Singleton(); private Singleton() { //초기화 } public Singleton getInstance() { return instance; } } }}} 자바에서의 예시 키보드 리더, 프린터 스풀러, 점수기록표 등 클래스의 객체를 하나만 만들어야 하는 경우 사용한다. 클래스 내에서 인스턴스가 단 하나뿐임을 보장하므로, 프로그램 전역에서 해당 클래스의 인스턴스를 바로 얻을 수 있고, 불필요한 메모리 낭비를 최소화한다. 이 패턴에서는 생성자를 클래스 자체만 사용할 수 있도록 private 등의 접근제한자를 통하여 제한하여야 한다. 생성자를 다른 곳에서도 사용할 수 있으면 그곳에서도 인스턴스를 만들 수 있기 때문. 싱글톤 패턴을 사용하기 위해서는 '''반드시''' 접근제한자를 이용하여 외부의 접근을 막거나, final로 reference를 변경 불가능하게 설정하여야 한다. 물론 생성자에 접근제한자를 사용하면 최소한 다른 인스턴스로 레퍼런스시키지는 못하겠지만, ClassName.singleton = null;처럼 레퍼런스 자체를 지워버릴 수 있기 때문. 구현 방법에는 사전 초기화, 사후 초기화 등이 있다. * Eager initialization(사전 초기화) 클래스 로딩시에 인스턴스를 생성하는 방법이다. 위의 예시가 사전 초기화. 멀티스레드 환경에서의 이중 객체 생성 문제[* 거의 비슷한 시간에 두 스레드가 동시에 싱글톤 인스턴스에 접근-없는 것을 확인하고 생성하여 객체를 생성하다가 싱글톤임에도 불구하고 객체가 중복되어 생성되는 문제]가 없지만, 인스턴스를 호출하지 않아도 무조건 클래스를 초기화하기에 메모리 효율이나 연산 효율은 낮다. 자바에서는 static block initialization이라는 변종도 있다. 클래스가 로딩될 때 최초 1회만 실행되는 static block을 통해 싱글톤 인스턴스를 초기화하는 방법인데, 구조적으로는 크게 다르지 않다. * Lazy initialization(사후 초기화) 인스턴스를 실제로 사용할 시점에서 인스턴스를 생성하는 방법이다. 세심한 방법을 쓰지 않으면 위에 언급한 이중 객체 생성 문제가 발생할 가능성이 높으나, 인스턴스를 실제로 사용하지 않는다면 메모리와 연산량을 아낄 수 있다는 장점이 있다. * 한국에서는 ton 때문에 싱글톤이라고 부르지만 실제 발음은 싱글"튼"에 가깝다. Jason처럼 영어 단어의 끝에 오는 on은 모음 발음이 없다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기